{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**问题：**\n",
    "假设你正在为一个电影推荐系统设计一个简单的KNN算法。我们有以下一些用户的电影评分数据，数据由两个特征组成：用户对电影A和电影B的评分，分别在1-5之间。用户的标签（电影类型偏好）是动作片（标签0）或者是喜剧片（标签1）。我们有一个新用户，他给电影A评分为3，电影B评分为4。请问这个用户可能偏好哪种类型的电影？\n",
    "\n",
    "**数据：**\n",
    "\n",
    "| 用户   | 电影A评分 | 电影B评分 | 偏好类型 |\n",
    "| ------ | --------- | --------- | -------- |\n",
    "| 用户1  | 5         | 1         | 动作片   |\n",
    "| 用户2  | 4         | 2         | 动作片   |\n",
    "| 用户3  | 2         | 5         | 喜剧片   |\n",
    "| 用户4  | 1         | 4         | 喜剧片   |\n",
    "| 用户5  | 3         | 2         | 动作片   |\n",
    "| 用户6  | 2         | 5         | 喜剧片   |\n",
    "\n",
    "你需要做以下步骤：\n",
    "1. 构造数据\n",
    "2. 创建KNN模型\n",
    "3. 使用数据训练模型\n",
    "4. 预测新用户的喜好"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 0. 引入核心包"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.neighbors import KNeighborsClassifier"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [],
   "source": [
    "data = [\n",
    "    [5, 1, 0],  # 动作片\n",
    "    [4, 2, 0],  # 动作片\n",
    "    [2, 5, 1],  # 喜剧片\n",
    "    [1, 4, 1],  # 喜剧片\n",
    "    [3, 2, 0],  # 动作片\n",
    "    [2, 5, 1]   # 喜剧片\n",
    "]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1. X, y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [],
   "source": [
    "X = np.array([[x[0], x[1]] for x in data])\n",
    "\n",
    "y = np.array([x[2] for x in data]) # 0表示动作片，1表示喜剧片"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2. 创建 KNN 模型\n",
    "k = 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [],
   "source": [
    "knn = KNeighborsClassifier(n_neighbors=1) "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3. 训练模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "KNeighborsClassifier(n_neighbors=1)"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "knn.fit(X, y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 4. 用模型推理(预测)用户的喜好"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "新用户可能喜欢喜剧片\n"
     ]
    }
   ],
   "source": [
    "import warnings\n",
    "warnings.filterwarnings(\"ignore\", category=FutureWarning)\n",
    "\n",
    "new_user = np.array([[3, 4]])\n",
    "prediction = knn.predict(new_user)\n",
    "if prediction == 0:\n",
    "    print(\"新用户可能喜欢动作片\")\n",
    "else:\n",
    "    print(\"新用户可能喜欢喜剧片\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 5. 数据可视化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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PbFlyxa4uLgYLSgiIiIiU9D7ztd79+41RhxEREREJqd3YQQAV69exfbt25Geno6CggKNbZ988olBAiMiIiKqaXoXRnv27MHAgQPRuHFjnD17Fk8++STS0tIghECHDh2MESMRERFRjdD7cv2oqCjMnj0bf/31F+zs7JCQkIArV66ge/fueOGFF4wRIxEREVGN0LswOnPmjPpO2FKpFA8fPoSjoyMWLlyIDz74wOABEhEREdUUvQujOnXqQC6XAwC8vLxw4cIF9babN28aLjIiIiKiGqb3GqNOnTrh4MGDaN26Nfr374/Zs2fj1KlT2LJlCzp16mSMGImIiIhqhN6F0SeffIL79+8DAObPn4/79+9j06ZNaNasmfomkERERETmSK/CqKioCFeuXEFAQAAAwMHBAV9++aVRAiMiIiKqaXqtMbK2tkafPn1w9+5dI4VDREREZDp6L75u27YtLl68aIxYiIiIiExK78Jo8eLFiIyMxI4dO5CZmYnc3FyNHyIiIiJzpffi6+eeew4AMHDgQEgkEnW7EAISiQRFRUWGi46IiIioBvEhskREREQqehdG3bt3N0YcRERERCan9xojIiIiIkvFwoiIiIhIhYURERERkYpJC6MVK1YgICAAzs7OcHZ2RkhICH7++edy90lOTkZQUBDs7OzQpEkTxMTE1FC0REREZOmqXRgVFBSon52mL29vb7z//vtISUlBSkoKnn32WYSHh+Pvv//W2f/SpUvo168funbtitTUVMydOxevv/46EhISqpMCEREREQA9C6PVq1fjtddew/r16wEAUVFRcHJyQt26dREaGopbt27pdfABAwagX79+8Pf3h7+/PxYvXgxHR0ccOXJEZ/+YmBg0atQI0dHRaNWqFSZOnIjx48dj6dKleh2XiIiISJdKX66/ePFiLF68GM888wzi4+Nx4MABbNu2DQsXLoSVlRWWL1+OefPmYcWKFVUKpKioCJs3b8aDBw8QEhKis8/hw4cRFham0danTx/ExsZCoVDAxsZGax+5XA65XK5+XXJ3boVCAYVCUaVYy1IynqHHrS0sPT/A8nNkfubP0nNkfubPWDnW1HsmEUKIynRs3rw5Fi5ciJEjRyIlJQVPP/00Nm3ahGHDhgEAfv75Z0ydOhWXL1/WK4BTp04hJCQE+fn5cHR0RHx8PPr166ezr7+/P8aOHYu5c+eq2w4dOoTOnTvj2rVr8PT01Npn/vz5WLBggVZ7fHw8HBwc9IqViIiITCMvLw+jRo1CTk4OnJ2djXacSp8xSk9PR5cuXQAAwcHBkEqlaNu2rXp7QEAAMjMz9Q6gRYsWOHnyJO7evYuEhAREREQgOTkZrVu31tn/0ceQAMpHkehqLxEVFYVZs2apX+fm5sLHxwdhYWEGf2MVCgUSExMRGhqq8+yVubP0/ADLz5H5mT9Lz5H5mT9j5VhTz2OtdGGkUCggk8nUr21tbTUSlkqlVXpOmq2tLZo1awZAWXAdO3YMn376Kb766iutvh4eHsjKytJoy87OhlQqhaurq87xZTKZRtwlbGxsjPZLacyxawNLzw+w/ByZn/mz9ByZn/kzdI419X7p9UiQ06dPqwsTIQT++ecf9RVpN2/eNEhAQgiNNUGPCgkJwY8//qjRtnv3bgQHB1v8LxgREREZn16FUa9evfDokqTnn38egPJrLCFEmV9nlWXu3Lno27cvfHx8cO/ePWzcuBFJSUnYtWsXAOXXYBkZGVi7di0AYOrUqfj8888xa9YsTJo0CYcPH0ZsbCw2bNig13GJiIiIdKl0YXTp0iWDH/z69et4+eWXkZmZibp16yIgIAC7du1CaGgoACAzMxPp6enq/o0bN8ZPP/2EmTNn4osvvoCXlxeWL1+OoUOHGjw2IiIievxUujDy9fU1+MFjY2PL3R4XF6fV1r17d5w4ccLgsRARERHxWWlEREREKiyMiIiIiFRYGBERERGpsDAiIiIiUqlSYVRYWIhff/0VX331Fe7duwcAuHbtmvqeRkRERETmSK/7GAHA5cuX8dxzzyE9PR1yuRyhoaFwcnLChx9+iPz8fMTExBgjTiIiIiKj0/uM0YwZMxAcHIw7d+7A3t5e3T548GDs2bPHoMERERER1SS9zxgdOHAABw8ehK2trUa7r68vMjIyDBYYERERUU3T+4xRcXGxzofFXr16FU5OTgYJioiIiMgU9C6MQkNDER0drX4tkUhw//59vPPOO+jXr58hYyMiIiKqUXp/lbZs2TL07NkTrVu3Rn5+PkaNGoXz58/Dzc2ND3MlIiIis6Z3YeTl5YWTJ09iw4YNOHHiBIqLizFhwgSMHj1aYzE2ERERkbnRuzACAHt7e4wfPx7jx483dDxEREREJlOpwmj79u3o27cvbGxssH379nL7Dhw40CCBEREREdW0ShVGgwYNQlZWFtzd3TFo0KAy+0kkEp1XrBERERGZg0oVRsXFxTr/TURERGRJ9L5cPy0tzQhhEBEREZme3oVRkyZN0KVLF3z11Ve4ffu2MWIiIiIiMgm9C6OUlBSEhITg3XffhZeXF8LDw7F582bI5XJjxEdERERUY/QujDp06ICPPvoI6enp+Pnnn+Hu7o4pU6bA3d2dl+8TERGRWdO7MCohkUjQs2dPrFy5Er/++iuaNGmCNWvWGDI2IiIiohpV5cLoypUr+PDDD9G+fXt07NgRderUweeff27I2IiIiIhqlN53vv7666+xfv16HDx4EC1atMDo0aOxbds2+Pn5GSE8IiIiopqjd2G0aNEijBgxAp9++inat29vhJCIiIiITEPvwig9PR0SicQYsRARERGZlN6FkUQiwd27dxEbG4szZ85AIpGgVatWmDBhAurWrWuMGImIiIhqRJXuY9S0aVMsW7YMt2/fxs2bN7Fs2TI0bdoUJ06cMEaMRERERDVC7zNGM2fOxMCBA7Fy5UpIpcrdCwsLMXHiRLzxxhvYt2+fwYMkIiIiqgl6F0YpKSkaRREASKVSzJkzB8HBwQYNjoiIiKgm6f1VmrOzM9LT07Xar1y5AicnJ4MERURERGQKehdGw4cPx4QJE7Bp0yZcuXIFV69excaNGzFx4kSMHDnSGDESERER1Qi9C6OlS5diyJAhGDNmDPz8/ODr64uxY8di2LBh+OCDD/Qaa8mSJejYsSOcnJzg7u6OQYMG4ezZs+Xuk5SUBIlEovXzzz//6JsKERERkQa91xjZ2tri008/xZIlS3DhwgUIIdCsWTM4ODjoffDk5GRMmzYNHTt2RGFhIf7v//4PYWFhOH36NOrUqVPuvmfPnoWzs7P6dYMGDfQ+PhEREdGj9C6MSjg4OKBt27bVOviuXbs0Xq9evRru7u44fvw4unXrVu6+7u7uqFevXrWOT0RERPSoShdG48ePr1S/VatWVTmYnJwcAED9+vUr7BsYGIj8/Hy0bt0a8+bNQ8+ePXX2k8vlkMvl6te5ubkAAIVCAYVCUeVYdSkZz9Dj1haWnh9g+TkyP/Nn6TkyP/NnrBxr6j2TCCFEZTpaWVnB19cXgYGBKG+XrVu3VikQIQTCw8Nx584d7N+/v8x+Z8+exb59+xAUFAS5XI5vv/0WMTExSEpK0nmWaf78+ViwYIFWe3x8fJW+/iMiIqKal5eXh1GjRiEnJ0djKY2hVbowevXVV7Fx40Y0atQI48ePx0svvVSpMzuVNW3aNOzcuRMHDhyAt7e3XvsOGDAAEokE27dv19qm64yRj48Pbt68afA3VqFQIDExEaGhobCxsTHo2LWBpecHWH6OzM/8WXqOzM/8GSvH3NxcuLm5Gb0wqvRXaV9++SWWLVuGLVu2YNWqVYiKikL//v0xYcIEhIWFVevBsq+99hq2b9+Offv26V0UAUCnTp2wbt06ndtkMhlkMplWu42NjdF+KY05dm1g6fkBlp8j8zN/lp4j8zN/hs6xpt4vvS7Xl8lkGDlyJBITE3H69Gm0adMGr776Knx9fXH//n29Dy6EwPTp07Flyxb89ttvaNy4sd5jAEBqaio8PT2rtC8RERFRiSpflVZy/yAhBIqLi6s0xrRp0xAfH48ffvgBTk5OyMrKAgDUrVsX9vb2AICoqChkZGRg7dq1AIDo6Gj4+fmhTZs2KCgowLp165CQkICEhISqpkJEREQEQM8zRnK5HBs2bEBoaChatGiBU6dO4fPPP0d6ejocHR31PviKFSuQk5ODHj16wNPTU/2zadMmdZ/MzEyNR5AUFBQgMjISAQEB6Nq1Kw4cOICdO3diyJAheh+fiIiI6FGVPmP06OLrcePGYePGjXB1da3WwSuz7jsuLk7j9Zw5czBnzpxqHZeIiIhIl0oXRjExMWjUqBEaN26M5ORkJCcn6+y3ZcsWgwVHREREVJMqXRiNGTOmWleeEREREdV2lS6MSn+lRURERGRp9Fp8TURERGTJWBgRERERqbAwIiIiIlJhYURERESkwsKIiIiISIWFEREREZEKCyMiIiIiFRZGRERERCosjIiIiIhUWBgRERERqbAwIiIiIlJhYURERESkwsKIiIiISIWFERFZpFu3bsHd3R1paWk1fuxhw4bhk08+qfHjWhrOIZkCCyMiskhLlizBgAED4OfnB0D5R/a5556Dl5cXZDIZfHx8MH36dOTm5uo17sqVK9G1a1e4uLjAxcUFvXv3xtGjRzX6vP3221i8eLHeY5Om0nP4qFu3bsHb2xsSiQR3797Va1zOIZWHhRERWZyHDx8iNjYWEydOVLdZWVkhPDwc27dvx7lz5xAXF4dff/0VU6dO1WvspKQkjBw5Env37sXhw4fRqFEjhIWFISMjQ90nICAAfn5+WL9+vcFyetzomsNHTZgwAQEBAVUam3NI5WFhREQWZ9euXZBKpQgJCVG3ubi44JVXXkFwcDB8fX3Rq1cvvPrqq9i/f79eY69fvx6vvvoq2rdvj5YtW2LlypUoLi7Gnj17NPoNHDgQGzZsMEg+jyNdc1hixYoVuHv3LiIjI6s0NueQysPCiIgszoEDBxAcHFxun2vXrmHLli3o3r17tY6Vl5cHhUKB+vXra7Q/9dRTOHr0KORyebXGf1yVNYenT5/GwoULsXbtWlhZGeZPGOeQHsXCiIgsTlpaGry8vHRuGzlyJBwcHNCwYUM4Ozvjm2++qdax3nzzTTRs2BC9e/fWaG/YsCHkcjmysrKqNf7jStccyuVyjBw5Eh999BEaNWpksGNxDulRLIyIyOLk5+fDzs5O57Zly5bhxIkT2LZtGy5cuIBZs2ZV+TgffvghNmzYgC1btmgdz97eHoDybATpT9ccRkVFoVWrVnjppZcMdhzOIZXGwoiILI6rqyvu3Lmjc5uHhwdatmyJ8PBwfPXVV1ixYgUyMzP1PsbSpUvx3nvvYffu3ToXAd++fRsA0KBBA73HJt1z+Ntvv2Hz5s2QSqWQSqXo1asXAMDNzQ3vvPOO3sfgHJIuUlMHQERkaO3bt6/UolkhBADovYbko48+wrvvvotffvmlzLVMf/31F7y9veHm5qbX2KSkaw4TEhLw8OFD9etjx45h/Pjx2L9/P5o2barX+JxDKgsLIyKyOKGhoZg3bx7u3LkDFxcXAMBPP/2E69evo2PHjnB0dMTp06cxZ84cdO7cWed9csry4Ycf4q233kJ8fDz8/PzU608cHR3h6Oio7rd//36EhYUZNK/Hia45LF383Lx5EwDQqlUr1KtXr9Jjcw6pPPwqjYgsTtu2bREcHIzvvvtO3WZvb4+VK1eiS5cuaNWqFd544w08//zz2LFjh8a+EokEcXFxZY795ZdfoqCgAMOGDYOnp6f6Z+nSpeo++fn52Lp1KyZNmmTw3B4XuuawsjiHVB08Y0REFumtt95CZGQkJk2aBCsrK/Ts2ROHDh0qd5+0tDRIpVJ07ty53D4ViY2NxdNPP41OnTrpGzY9ovQcltajRw/116ElOIdUXTxjREQW4fp1YMsW5b+3bAGCgvphypQpGnczrsiuXbswefJkNG/evFqx2NjY4LPPPqvWGI8jziHVBjxjRERm7dQp4L33gO+/B2xsgA0bgHHjAIUCGDZsBp59FvDxqdxY+j4epCyTJ082yDiPC84h1SY8Y0REZuuXX4CnnlL+QS0s1NxWWKhsf+opZT+qnTiHVNuYtDBasmQJOnbsCCcnJ7i7u2PQoEE4e/ZshfslJycjKCgIdnZ2aNKkCWJiYmogWiKqTU6dAgYNAuRy7T+oJQoLldsHDVL2p9qFc0i1kUkLo+TkZEybNg1HjhxBYmIiCgsLERYWhgcPHpS5z6VLl9CvXz907doVqampmDt3Ll5//XUkJCTUYOREZGrvvaf8o1lq7a0WIZT9liypmbio8jiHVBuZdI3Rrl27NF6vXr0a7u7uOH78OLp166Zzn5iYGDRq1AjR0dEAlPevSElJwdKlSzF06FBjh0xEtcD167q/eilLYSGweTMQHQ24uxs1NKokziHVVrVq8XVOTg4AaD3h+FGHDx/WuuFWnz59EBsbC4VCARsbG41tcrlc4662ubm5AACFQgGFQmGo0NVjPvq/lsbS8wMsP0dLyS8pSblIt9THHfb2Co3/1bXf4MHGjc3YOIfmPYeWMn/lMVaONfWeSUTpm0CYiBAC4eHhuHPnDvbv319mP39/f4wdOxZz585Vtx06dAidO3fGtWvX4OnpqdF//vz5WLBggdY48fHxcHBwMFwCREREZDR5eXkYNWoUcnJy4OzsbLTj1JozRtOnT8eff/6JAwcOVNhXIpFovC6p7Uq3A8qnMT/69Ozc3Fz4+PggLCzM4G+sQqFAYmIiQkNDtc5cWQJLzw+w/BwtJb8tW5SXc5dmb6/AqlWJGD8+FA8faucXF2feZxsAzqG5z6GlzF95jJVjyTc+xlYrCqPXXnsN27dvx759++Dt7V1uXw8PD/VzbUpkZ2dDKpXC1dVVq79MJoNMJtNqt7GxMdovpTHHrg0sPT/A8nM09/x69FDe46as9SkPH9po/VGVSpX7mXHaGjiH5s3c568yDJ1jTb1fJr0qTQiB6dOnY8uWLfjtt9/QuHHjCvcJCQlBYmKiRtvu3bsRHBxs8b9kRKT0xBPAsGHKP5SVIZUCL7zARbu1CeeQaiuTFkbTpk3DunXrEB8fDycnJ2RlZSErKwsPHz5U94mKisKYMWPUr6dOnYrLly9j1qxZOHPmDFatWoXY2FhERkaaIgUiMpG5c5V/LHV8g65BIlH2i4qqmbio8jiHVBuZtDBasWIFcnJy0KNHD40nHG/atEndJzMzE+np6erXjRs3xk8//YSkpCS0b98eixYtwvLly3mpPtFjpm1bYNs2QCYr+6yDVKrcvm2bsj/VLpxDqo1MusaoMhfExcXFabV1794dJ06cMEJERGRO+vQBjh5V3vhv82bNbSVfvURF8Q9qbcY5pNqmViy+JiKqqrZtgfh45Y3/kpKUbXFxykW6XI9iHjiHVJvwIbJEZBHc3f93GffgwfyDao44h1QbsDAiIiIiUmFhRERERKTCwoiIiIhIhYURERERkQoLIyIiIiIVFkZEREREKiyMiIiIiFRYGBERERGpsDAiIiIiUmFhRERERKTCwoiIiIhIhYURERERkQoLIyIiIiIVFkZEREREKiyMiIiIiFRYGBERERGpsDAiIiIiUmFhRERERKTCwoiIiIhIhYURERERkQoLIyIiIiIVFkZEREREKiyMiIiIiFRYGBERERGpsDAiIiIiUmFhRERERKTCwoiIiIhIhYURERERkQoLIyIiIiIVkxZG+/btw4ABA+Dl5QWJRIJt27aV2z8pKQkSiUTr559//qmZgImIiMiiSU158AcPHqBdu3YYN24chg4dWun9zp49C2dnZ/XrBg0aGCM8IiIiesyYtDDq27cv+vbtq/d+7u7uqFevnuEDIiIioseaSQujqgoMDER+fj5at26NefPmoWfPnmX2lcvlkMvl6te5ubkAAIVCAYVCYdC4SsYz9Li1haXnB1h+jszP/Fl6jszP/Bkrx5p6zyRCCFEjR6qARCLB1q1bMWjQoDL7nD17Fvv27UNQUBDkcjm+/fZbxMTEICkpCd26ddO5z/z587FgwQKt9vj4eDg4OBgqfCIiIjKivLw8jBo1Cjk5ORrLaQzNrAojXQYMGACJRILt27fr3K7rjJGPjw9u3rxp8DdWoVAgMTERoaGhsLGxMejYtYGl5wdYfo7Mz/xZeo7Mz/wZK8fc3Fy4ubkZvTAyy6/SHtWpUyesW7euzO0ymQwymUyr3cbGxmi/lMYcuzaw9PwAy8+R+Zk/S8+R+Zk/Q+dYU++X2d/HKDU1FZ6enqYOg4iIiCyASc8Y3b9/H//++6/69aVLl3Dy5EnUr18fjRo1QlRUFDIyMrB27VoAQHR0NPz8/NCmTRsUFBRg3bp1SEhIQEJCgqlSICIiIgti0sIoJSVF44qyWbNmAQAiIiIQFxeHzMxMpKenq7cXFBQgMjISGRkZsLe3R5s2bbBz507069evxmMnIiIiy2PSwqhHjx4ob+13XFycxus5c+Zgzpw5Ro6KiIiIHldmv8aIiIiIyFBYGBERERGpsDAiIiIiUmFhRERERKTCwoiIiIhIhYURERERkQoLIyIiIiIVFkZEREREKiyMiIiIiFRYGBERERGpsDAiIiIiUmFhRERERKTCwoiIiIhIhYURERERkQoLIyIiIiIVFkZEREREKiyMiIiIyChu3boFd3d3pKWl1fixhw0bhk8++UTv/VgYERERkVEsWbIEAwYMgJ+fn7pNIpFo/cTExOg17t9//42hQ4fCz88PEokE0dHRWn3efvttLF68GLm5uXqNzcKIiIiIDO7hw4eIjY3FxIkTtbatXr0amZmZ6p+IiAi9xs7Ly0OTJk3w/vvvw8PDQ2efgIAA+Pn5Yf369XqNzcKIiIiIDG7Xrl2QSqUICQnR2lavXj14eHiof+zt7fUau2PHjvjoo48wYsQIyGSyMvsNHDgQGzZs0GtsFkZERERkcAcOHEBwcLDObdOnT4ebmxs6duyImJgYFBcXGyWGp556CkePHoVcLq/0PlKjREJERESPtbS0NHh5eWm1L1q0CL169YK9vT327NmD2bNn4+bNm5g3b57BY2jYsCHkcjmysrLg6+tbqX1YGBEREZHB5efnw87OTqv90QKoffv2AICFCxcapTAq+YouLy+v0vvwqzQiIiIyOFdXV9y5c6fCfp06dUJubi6uX79u8Bhu374NAGjQoEGl92FhRERERAbXvn17nD59usJ+qampsLOzQ7169Qwew19//QVvb2+4ublVeh9+lUZEREQGFxoainnz5uHOnTtwcXEBAPz444/IyspCSEgI7O3tsXfvXvzf//0fJk+eXO7VZaUVFBSoi66CggJkZGTg5MmTcHR0RLNmzdT99u/fj7CwML3i5hkjIiIiMri2bdsiODgY3333nbrNxsYGX375JUJCQhAQEIBPP/0UCxcuxMcff6yxr0QiQVxcXJljX7t2DYGBgQgMDERmZiaWLl2KwMBAjXsm5efnY+vWrZg0aZJecfOMERERERnFW2+9hcjISEyaNAlWVlZ47rnn8Nxzz5W7T1paGqRS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\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.title(\"User Movie Preference\", size=15) \n",
    "plt.xlabel(\"Movie A rating\")\n",
    "plt.ylabel(\"Movie B rating\")\n",
    "plt.grid()\n",
    "\n",
    "# 绘制原始样本点，要求不同的影片喜好类别用不同的颜色标记\n",
    "# 提示: 用scatter散点图绘制，用它的参数c实现不同的类别用不同的颜色标记\n",
    "plt.scatter(X[y == 0][:, 0], X[y == 0][:, 1], label='Action', c='b', marker='o', s=80)\n",
    "plt.scatter(X[y == 1][:, 0], X[y == 1][:, 1], label='Comedy', c='g', marker='s', s=80)\n",
    "\n",
    "# 绘制新数据点，用红色x标记，大小为8\n",
    "# 提示：用plt.plot()绘制，用它的参数marker实现不同的标记符号\n",
    "plt.plot(new_user[0, 0], new_user[0, 1], 'rx', markersize=8, label='New User')\n",
    "\n",
    "# 新数据最近邻索引为第一个最近邻的索引\n",
    "dist, idx = knn.kneighbors(new_user)\n",
    "nearest = X[idx[0]]# 获取最近邻点的坐标，这是一个列表，第一个元素是x坐标，第二个元素是y坐标\n",
    "\n",
    "# 用红线标记新数据点与最近邻点的连接线\n",
    "# 提示：用plt.plot()绘制，用 r-- 实现红色虚线\n",
    "\n",
    "plt.plot([new_user[0, 0], nearest[0, 0]], [new_user[0, 1], nearest[0, 1]], 'r--')\n",
    "\n",
    "# 为每个点添加坐标文本  \n",
    "for x, y in zip(X[:, 0], X[:, 1]):\n",
    "    plt.text(x, y+0.1, f'({x}, {y})') \n",
    "\n",
    "# 为新数据点添加坐标文本\n",
    "plt.text(new_user[0,0], new_user[0,1]+0.1, f'({new_user[0,0]}, {new_user[0,1]})')\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
